Skip to content

Conversation

dianne
Copy link
Contributor

@dianne dianne commented May 20, 2025

We resolve guard patterns' guards in resolve_pattern_inner, so to avoid resolving them multiple times, we must avoid doing so earlier. To accomplish this, LateResolutionVisitor::visit_pat contains a case for guard patterns that avoids visiting their guards while walking patterns.

This PR fixes #141265, which was due to visit::walk_pat being used instead; this meant guards at the top level of a pattern would be visited twice. e.g. it would ICE on for x if x in [] {}, but not for (x if x) in [] {}. visit_pat was already used for the guard pattern in the second example, on account of the top-level pattern being parens.

We resolve guard patterns' guards in `resolve_pattern_inner`, so to
avoid resolving them multiple times, we must avoid doing so earlier. To
accomplish this, `LateResolutionVisitor::visit_pat` contains a case for
guard patterns that avoids visiting their guards while walking patterns.
This fixes an ICE due to `visit::walk_pat` being used instead, which
meant guards at the top level of a pattern would be visited twice.
@rustbot
Copy link
Collaborator

rustbot commented May 20, 2025

r? @oli-obk

rustbot has assigned @oli-obk.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 20, 2025
@oli-obk
Copy link
Contributor

oli-obk commented May 21, 2025

@bors r+ rollup

@bors
Copy link
Collaborator

bors commented May 21, 2025

📌 Commit ed983c2 has been approved by oli-obk

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels May 21, 2025
bors added a commit to rust-lang-ci/rust that referenced this pull request May 21, 2025
…iaskrgr

Rollup of 7 pull requests

Successful merges:

 - rust-lang#141267 (only resolve top-level guard patterns' guards once)
 - rust-lang#141280 (Use Docker cache from the current repository)
 - rust-lang#141296 (Async drop fix for 'broken mir, place has deref as later projection')
 - rust-lang#141328 (When AsyncDrop impl is empty, sync drop generated in elaborator)
 - rust-lang#141332 (Do not eagerly fold consts in `normalize_param_env_or_error` if new solver)
 - rust-lang#141333 (Use `DeepRejectCtxt` in `assemble_inherent_candidates_from_param`)
 - rust-lang#141334 (eagerly check nested obligations when coercing fndefs)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit af081a4 into rust-lang:master May 21, 2025
6 checks passed
@rustbot rustbot added this to the 1.89.0 milestone May 21, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request May 21, 2025
Rollup merge of rust-lang#141267 - dianne:fix-141265, r=oli-obk

only resolve top-level guard patterns' guards once

We resolve guard patterns' guards in `resolve_pattern_inner`, so to avoid resolving them multiple times, we must avoid doing so earlier. To accomplish this, `LateResolutionVisitor::visit_pat` contains a case for guard patterns that avoids visiting their guards while walking patterns.

This PR fixes rust-lang#141265, which was due to `visit::walk_pat` being used instead; this meant guards at the top level of a pattern would be visited twice. e.g. it would ICE on `for x if x in [] {}`, but not `for (x if x) in [] {}`. `visit_pat` was already used for the guard pattern in the second example, on account of the top-level pattern being parens.
@dianne dianne deleted the fix-141265 branch May 22, 2025 11:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ICE: path resolved multiple times
4 participants